Ana içeriğe geç

Literaller ve Tanımlayıcılar

Sayı Literalleri

FunC, ondalık ve onaltılık tam sayı literallerine izin verir (ön ek sıfırlar izinlidir).

Bu literaller, programın çeşitli bölümlerinde kullanılabilir.

Örneğin:

  • 0,
  • 123,
  • -17,
  • 00987,
  • 0xef,
  • 0xEF,
  • 0x0,
  • -0xfFAb,
  • 0x0001,
  • -0,
  • -0x0 geçerli sayı literalleridir.

Dize Literalleri

FunC'de dizeler çift tırnak içinde " " alınır, örneğin "bu bir dizedir".

İsteğe bağlı olarak, dize literalleri sonrasında bir tür belirtebilir, örneğin "dize"u.

Aşağıdaki dize türleri desteklenir:

  • tür olmadan—asm işlev tanımları için ve ASCII dizesi ile bir dilim sabit belirlemek için kullanılır
  • s—içeriğine göre ham bir dilim sabiti tanımlar (hex kodlu ve isteğe bağlı olarak bit ile doldurulmuş)
  • a—belirtilen adresten MsgAddressInt yapısını içeren bir dilim sabiti oluşturur
  • u—sağlanan ASCII dizesinin hex değerlerine karşılık gelen bir int sabiti oluşturur
  • h—dizenin SHA256 hash'inin ilk 32 bitini içeren bir int sabiti oluşturur
  • H—dizenin SHA256 hash'inin tüm 256 bitini içeren bir int sabiti oluşturur
  • c—dizenin crc32 değerini içeren bir int sabiti oluşturur
Örneklerle açıklamak gerekirse:

Aşağıdaki değerler karşılık gelen sabitleri verir:

  • "string" x{737472696e67} dilim sabitine dönüşür
  • "abcdef"s x{abcdef} dilim sabitine dönüşür
  • "Ef8zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM0vF"a x{9FE6666666666666666666666666666666666666666666666666666666666666667_} dilim sabitine dönüşür (addr_std$10 anycast:none$0 workchain_id:int8=0xFF address:bits256=0x33...33)
  • "NstK"u 0x4e73744b int sabitine dönüşür
  • "transfer(slice, int)"h 0x7a62e8a8 int sabitine dönüşür
  • "transfer(slice, int)"H 0x7a62e8a8ebac41bd6de16c65e7be363bc2d2cbc6a0873778dead4795c13db979 int sabitine dönüşür
  • "transfer(slice, int)"c 2235694568 int sabitine dönüşür

Tanımlayıcılar

FunC, çok geniş bir tanımlayıcı sınıfına (işlevler ve değişken adları) izin verir.

Yani, özel semboller ;, ,, (, ), (boşluk veya sekme), ~ ve ., yorum veya dize literali (") ile başlamayan, bir sayı literali olmayan, bir alt çizgi _ olmayan ve bir anahtar kelime olmayan herhangi (tek satırlık) dize geçerli bir tanımlayıcıdır.

Ayrıca, işlev tanımlarındaki işlev adları . veya ~ ile başlayabilir.

Örnek geçerli tanımlayıcılar:

  • query, query', query''
  • elem0, elem1, elem2
  • CHECK
  • _internal_value
  • message_found?
  • get_pubkeys&signatures
  • dict::udict_set_builder
  • _+_
  • fatal!

Bir değişken adının sonundaki ', genellikle eski değerin değiştirilmiş bir versiyonunun tanıtıldığı zaman kullanılır.

Örneğin, neredeyse tüm hashmap manipülasyonu için olan yerleşik değiştirme işleçleri (~ ile ön ekli olanlar hariç) bir hashmap alır ve gerekirse, başka verilerle birlikte hashmap'in yeni bir versiyonunu döner. Bu değerleri, aynı ada sahip olup ' ile sonlandırmak uygun olur.

Suffix ?, genellikle boolean değişkenler için kullanılır (TVM'nin yerleşik bir boolean türü yoktur; boolean'lar tam sayılarla temsil edilir: 0 yanlış ve -1 doğrudur) veya genellikle bir işlemin başarısını gösteren bir bayrak döndüren işlevler için kullanılır (örneğin, stdlib.fc içindeki udict_get?).

Geçersiz tanımlayıcılar:

  • take(first)Entry
  • "not_a_string
  • msg.sender
  • send_message,then_terminate
  • _

Daha nadir geçerli tanımlayıcı örnekleri:

  • 123validname
  • 2+2=2*2
  • -alsovalidname
  • 0xefefefhahaha
  • {hehehe}
  • pa{--}in"`aaa`"

Geçersiz tanımlayıcılar:

  • pa;;in"`aaa`" (çünkü ; yasaktır)
  • {-aaa-}
  • aa(bb
  • 123 (bu bir sayı)

Örneğin, `Ben de bir değişkenim` geçerli bir tanımlayıcıdır, ayrıca `herhangi bir sembol ; ~ () burada geçerlidir...` de geçerlidir.

Sabitler

FunC, derleme zamanında sabitler tanımlamanıza izin verir; bu sabitler derleme sırasında değiştirilir ve önceden hesaplanır.

Sabitler şu şekilde tanımlanır:

const optional-type identifier = value-or-expression;

optional-type, belirli bir sabit türünü zorlamak ve daha iyi okunabilirlik için kullanılabilir.

Şu anda, int ve slice türleri desteklenmektedir.

value-or-expression, bir literali veya sabitlerin ve literallerin önceden hesaplanabilir bir ifadesini içerebilir.

Örneğin, sabitler şu şekilde tanımlanabilir:

  • const int101 = 101; int101 sabitini tanımlar; bu, sayısal literale eşdeğerdir 101
  • const str1 = "const1", str2 = "aabbcc"s; bu, kendi karşılık gelen dizelerine eşit olan iki sabiti tanımlar
  • const int int240 = ((int1 + int2) * 10) << 3; hesaplamanın sonucuna eşit olan int240 sabitini tanımlar
  • const slice str2r = str2; str2r sabitini tanımlar; bu, str2 sabitinin değerine eşittir